<?php

require_once(BaseConfig::LoadClass('objeto_base.class.php'    ));
require_once(BaseConfig::LoadClass('filtro.class.php'         ));
require_once(BaseConfig::LoadClass('abc.class.php'            ));
require_once(BaseConfig::LoadClass('pagina.class.php'         ));
require_once(BaseConfig::LoadClass('pagina_catalogo.class.php'));
require_once(BaseConfig::LoadClass('vendedores.class.php'     ));

class Forecast extends ObjetoBase {
  var $intIdForecast;
  var $dteFecha     ;
  var $intOrden     ;
  var $strLabel     ;
  var $intIdVendedor;
  var $fltDato1     ;
  var $fltDato2     ;
  var $fltDato3     ;
  
  function Forecast($intIdForecast = 0) {
    $arrMapaDatos = Array();
    $arrMapaDatos['id_forecast'] = Array('NombreVariable' => 'intIdForecast', 'TipoVariable' => 'I');
    $arrMapaDatos['fecha'      ] = Array('NombreVariable' => 'dteFecha'     , 'TipoVariable' => 'D');
    $arrMapaDatos['orden'      ] = Array('NombreVariable' => 'intOrden'     , 'TipoVariable' => 'N');
    $arrMapaDatos['label'      ] = Array('NombreVariable' => 'strLabel'     , 'TipoVariable' => 'S');
    $arrMapaDatos['id_vendedor'] = Array('NombreVariable' => 'intIdVendedor', 'TipoVariable' => 'N');
    $arrMapaDatos['dato_1'     ] = Array('NombreVariable' => 'fltDato1'     , 'TipoVariable' => 'N');
    $arrMapaDatos['dato_2'     ] = Array('NombreVariable' => 'fltDato2'     , 'TipoVariable' => 'N');
    $arrMapaDatos['dato_3'     ] = Array('NombreVariable' => 'fltDato3'     , 'TipoVariable' => 'N');
    
    $this->__ArmarDatosPrivados('forecast', $arrMapaDatos, 'id_forecast');
    $this->SeleccionarPorIndice($intIdForecast);
  }
}

class FiltroForecast extends Filtro {
  function FiltroForecast() {
    $arrProceso["fecha"      ] = "Fecha"   ;
    $arrProceso["orden"      ] = "Orden"   ;
    $arrProceso["label"      ] = "Label"   ;
    $arrProceso["id_vendedor"] = "Vendedor";
    $arrProceso["dato_1"     ] = "Dato 1"  ;
    $arrProceso["dato_2"     ] = "Dato 2"  ;
    $arrProceso["dato_3"     ] = "Dato 3"  ;
    
    $arrReferencias = array();
    $arrReferencias["id_vendedor"]["tabla"]["nombre"] = "vendedores" ;
    $arrReferencias["id_vendedor"]["tabla"]["indice"] = "id_vendedor";
    $arrReferencias["id_vendedor"]["tabla"]["desc"  ] = "nombre"     ;
    
    parent::CrearFiltro("forecast", "id_forecast", $arrProceso, "Busqueda", "", "", "Forecast", $arrReferencias);
  }
}

class Carga_Forecast extends CargaExcel {
  function Carga_Forecast() {
    parent::CargaExcel();
    $this->Init("Forecast", "carga_forecast");
    $this->__arrDatosExtraInput["fecha"] = "Fecha (YYYY-MM-DD)";
  }
  
  function Cargar() {
    $oConecta = new Conecta();
    $strErrorSubida = $this->__SubirArchivo();
    if($strErrorSubida) {
      return $strErrorSubida;
    }
    $this->__ObtenerDatosExtra();
    $this->oLoadXLS->Init($this->__strUploadsAct . "/" . $this->__strNombreArc, $this->__arrInfoChequeo, $this->intNumCols, $this->__arrInfoSaltarLinea, $this->intPrimeraLinea, $this->bolManejarPaginasTodas);
    
    // Borramos el anterior
    $strFecha = $this->arrValoresConstantes["fecha"];
    $strConsulta = "DELETE FROM forecast WHERE fecha = '$strFecha'";
    $oConecta->Consulta($strConsulta);
    
    // Obtenemos el indice para la carga
    $strConsulta = "SELECT MAX(indice_carga) AS indice_act FROM forecast";
    $oConecta->Consulta($strConsulta);
    $intIndiceCarga = $oConecta->Field('indice_act') + 1;
    
    // Obtener a los vendedores
    $strConsulta = "SELECT * FROM vendedores";
    $oConecta->Consulta($strConsulta);
    while(!$oConecta->EOF) {
      $arrVendedores[strtoupper(trim($oConecta->Field('nombre')))] = $oConecta->Field('id_vendedor');
      $oConecta->MoveNext();
    }
    
    // Buscar el final de los datos (Terminan donde dice "Grand Total" y quitar las lineas restantes
    
    foreach($this->oLoadXLS->xlsArchivo->sheets[0]["cells"] as $intRow => $arrInfoRow) {
      if(isset($arrInfoRow[1]) && (strtoupper(trim($arrInfoRow[1])) == "GRAND TOTAL")) {
        $intLastRow = $intRow;
        break;
      }
    }
    
    // Buscar donde inician los datos, y los indices de cada vendedor
    // Suponer que los vendedores empiezan en el Row 3, col 3, y que los valores 2, 3, 4 son los globales
    $arrIndicesVendedores[0]["d1"] = 2;
    $arrIndicesVendedores[0]["d2"] = 3;
    $arrIndicesVendedores[0]["d3"] = 4;
    
    for($i = 5; $i < $this->oLoadXLS->xlsArchivo->sheets[0]["numCols"]; $i += 3) {
      if(!isset($this->oLoadXLS->xlsArchivo->sheets[0]["cells"][3][$i])) continue;
      $strVendedor = strtoupper(trim($this->oLoadXLS->xlsArchivo->sheets[0]["cells"][3][$i]));
      if(!$strVendedor) continue;
      if(!isset($arrVendedores[$strVendedor])) {
        echo "No se encuentra el vendedor $strVendedor<br />";
      } else {
        $arrIndicesVendedores[$arrVendedores[$strVendedor]]["d1"] = $i + 0;
        $arrIndicesVendedores[$arrVendedores[$strVendedor]]["d2"] = $i + 1;
        $arrIndicesVendedores[$arrVendedores[$strVendedor]]["d3"] = $i + 2;
      }
    }
    
    $intOrden = 0;
    for($i = 4; $i < $intLastRow; $i++) {
      $arrDatos = $this->oLoadXLS->xlsArchivo->sheets[0]["cells"][$i];
      if(trim(strtoupper($arrDatos[1])) == "ROW LABELS") {
        // Esta es la que contiene los indices de las fechas. No cargar
      } else {
        $intOrden++;
        foreach($arrIndicesVendedores as $intIndiceVendedor => $arrDV) {
          if(!isset($arrDatos[$arrDV["d1"]]) && !isset($arrDatos[$arrDV["d2"]]) && !isset($arrDatos[$arrDV["d3"]])) {
            // Este vendedor no tiene montos
            continue;
          }
          
          if(!isset($arrDatos[$arrDV["d1"]])) $arrDatos[$arrDV["d1"]] = 0;
          if(!isset($arrDatos[$arrDV["d2"]])) $arrDatos[$arrDV["d2"]] = 0;
          if(!isset($arrDatos[$arrDV["d3"]])) $arrDatos[$arrDV["d3"]] = 0;
          
          $strConsulta  = "";
          $strConsulta .= "INSERT INTO forecast (";
          $strConsulta .= "  fecha       , ";
          $strConsulta .= "  orden       , ";
          $strConsulta .= "  label       , ";
          $strConsulta .= "  id_vendedor , ";
          $strConsulta .= "  dato_1      , ";
          $strConsulta .= "  dato_2      , ";
          $strConsulta .= "  dato_3      , ";
          $strConsulta .= "  indice_carga  ";
          $strConsulta .= ") VALUES ( ";
          $strConsulta .= "  '{$strFecha              }', ";
          $strConsulta .= "  '{$intOrden              }', ";
          $strConsulta .= "  '{$arrDatos[1]           }', ";
          $strConsulta .= "  '{$intIndiceVendedor     }', ";
          $strConsulta .= "  '{$arrDatos[$arrDV["d1"]]}', ";
          $strConsulta .= "  '{$arrDatos[$arrDV["d2"]]}', ";
          $strConsulta .= "  '{$arrDatos[$arrDV["d3"]]}', ";
          $strConsulta .= "  '{$intIndiceCarga        }' ";
          $strConsulta .= ")";
          
          $oConecta->Consulta($strConsulta);
        }
      }
    }
    return "<h1>Carga de FORECAST correcta</h1>";
  }
}


class ABC_Forecast extends ABC_Base {
  function ABC_Forecast() {
    $strClaseBase     = "Forecast"      ;
    $strClaseFiltro   = "FiltroForecast";
    $strClaseCarga    = "Carga_Forecast";
    $strCampoMostrar  = "label"         ;
    $strOpcionListado = "abc_forecast"  ;
    $strOpcionGuardar = "abc_forecast"  ;

    $arrNombresColumnas = array();
    $arrNombresColumnas["fecha"      ] = "Fecha"   ;
    $arrNombresColumnas["orden"      ] = "Orden"   ;
    $arrNombresColumnas["label"      ] = "Label"   ;
    $arrNombresColumnas["id_vendedor"] = "Vendedor";
    $arrNombresColumnas["dato_1"     ] = "Dato 1"  ;
    $arrNombresColumnas["dato_2"     ] = "Dato 2"  ;
    $arrNombresColumnas["dato_3"     ] = "Dato 3"  ;

    $arrReferencias = array();
    $arrReferencias["id_vendedor"]["tabla"]["nombre"] = "vendedores" ;
    $arrReferencias["id_vendedor"]["tabla"]["indice"] = "id_vendedor";
    $arrReferencias["id_vendedor"]["tabla"]["desc"  ] = "nombre"     ;
    $arrReferencias["id_vendedor"]["tabla"]["extra" ] = array("0" => ":: TOTALES ::");
    
    $this->Inicializar($strClaseBase, $arrNombresColumnas, $strOpcionListado, $strOpcionGuardar, $strCampoMostrar, $strClaseFiltro, $arrReferencias, "", $strClaseCarga);
    
    $this->bolABCLista             = true;
    $this->bolABCListaOcultarTD    = true;
    $this->bolPosibleNuevoElemento = false;
    $this->intTipoGuardado         = 1;
    $this->intNumeroRes            = 50;
    $this->bolSoloLectura          = true;
  }
}

?>